package com.fysports.web.controller;

import com.jfinal.core.Controller;
import com.jfinal.ext.kit.RequestWarpper;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.Page;
import com.fysports.framework.render.TimerJsonRender;
import com.fysports.web.kit.cache.DictCacheKit;
import com.fysports.web.kit.commons.PathBizKit;
import com.fysports.web.kit.dtgrid.DTGridKit;
import com.fysports.web.kit.dtgrid.DTGridView;
import com.fysports.web.kit.dtgrid.ExportUtils;
import com.fysports.web.model.BaseModel;
import com.fysports.web.model.system.SystemLog;
import com.fysports.web.module.core.DefaultModuleBuilder;
import com.fysports.web.module.core.IModule;
import com.fysports.web.module.core.IModuleFactory;
import com.fysports.web.module.core.ModuleException;
import com.fysports.web.module.view.JsonView;
import com.fysports.web.module.view.OperateType;
import com.fysports.web.module.view.vo.BaseWebVO;

import java.util.ArrayList;
import java.util.List;


/**
 * controll 基础类
 * 集成
 * Created by konbluesky
 * Date : 14-7-30 下午1:35
 * Project : JdmData_WebServer
 */
public abstract class AbstractBaseController extends Controller {
    private static Log logger = Log.getLog(AbstractBaseController.class);
    List<IModule> modules = new ArrayList<IModule>();
    protected SystemLog reqSysLog;// 访问日志
    protected static int pageSize = DictCacheKit.getNormalPageSize();
    protected RequestWarpper bizRequest;
    /*breadcrumb & menu module*/
    protected IModuleFactory moduleFactory=new DefaultModuleBuilder();

    public void execute() {
        if (modules.isEmpty()) {
            return;
        }
        for (IModule m : modules) {
            try {
                m.execute();
            }
            catch (ModuleException ex) {
                logger.error("执行模块出现异常:" + ex.getLocalizedMessage(),ex);
                throw  new ControllerException(ex.getLocalizedMessage(),ex);
            }
            catch (Exception e) {
                logger.error("不可预知的错误:" + e.getLocalizedMessage(),e);
                throw  new ControllerException(e);
            }

        }
    }


    /**
     * 默认index,防止误进url导致整个页面瘫痪
     */
    protected void index() {
        moduleFactory.create(this);
        execute();
    }


    public void setModule(IModule m) {
        modules.add(m);
    }


    /**
     * ajax提交的数据请求,用jsonview来回传
     *
     * @param jv
     */
    public void renderJson(JsonView jv) {
        if (jv == null)
            return;
        render(new TimerJsonRender(jv));
    }

    public void renderExport(DTGridView dtview){
        try {
            ExportUtils.export(getRequest(), getResponse(), dtview);
        }
        catch (Exception e) {
            throw new ControllerException(e);
        }
        renderNull();
    }

    /**
     * 表格用的带条件的分页参数
     * ?a=1&b=2&c=3
     *
     * @param vo
     */
    public void setTablePageUrlParams(BaseWebVO vo) {
        //        if(StringKit.isBlank(vo.toParams())) {
        //            logger.error("val can not be blank");
        //            throw new IllegalArgumentException("val can not be blank");
        //        }
        setAttr("TB_URL_PARAM", vo.toParams());
    }


    /**
     * 因项目初期一直使用Jquery-datatable 控件，该控件将分页搜索集成一体，
     * 考虑到数据量增加后，该种方案需要慎用，故将常用操作封装到basewebvo中。
     * 在使用自定义table时，多种查询条件时，需要结合BaseWebVO 更加方便。
     *
     * @param vo
     */
    public void setBaseWebVO(BaseWebVO vo) {
        /* 设置分页参数 */
        setTablePageUrlParams(vo);
        /* 页面回显参数 */
        vo.setQueryData(this);
    }


    /**
     * 验证表单是否重复提交，如重复提交则提示。
     *
     * @return
     */
    public boolean checkFormToken() {
        boolean status = validateToken();
        if (!status) {
            renderJson(new JsonView(false, OperateType.OPERATE_FAIL_REPETITION));
        }
        return status;
    }


    public SystemLog getReqSysLog() {
        return reqSysLog;
    }


    public void setReqSysLog(SystemLog reqSysLog) {
        this.reqSysLog = reqSysLog;
    }


    public void setModules(List<IModule> modules) {
        this.modules = modules;
    }


    public RequestWarpper getBizRequest() {
        if(bizRequest==null){
            bizRequest=new RequestWarpper(getRequest());
        }
        return bizRequest;
    }


    /**
     * 获取admin路径下模板地址(快捷方法)
     * @param path
     * @return /WEB-INF/template/page/admin[PATH]
     */
    public String getAdminPath(String path){
        return PathBizKit.getPageAdminPath(path);
    }

    public DTGridView getGridView(){
        return DTGridKit.toDtView(getPara(DTGridKit.PARAM_NAME));
    }

    public DTGridView toGridView(DTGridView view,Page<? extends BaseModel> pager){
        return DTGridKit.toDtView(view,pager);
    }
}
